#include <stdio.h>
#include <string.h>

#define N 502 // 主字符串最大长度
#define M 52  // 子串最大长度

// 实现字符串定位函数：找到str中第一次出现substr的位置

const char *MyStrStr(const char *str, const char *substr)
{
    const char *s1, *s2, *start;
    while (*str)
    {                // 遍历主字符串
        start = str; // 记录主字符串当前字符位置
        s1 = str;
        s2 = substr;

        // 检查从当前字符开始，是否与子串匹配
        while (*s1 && *s2 && *s1 == *s2)
        {
            s1++;
            s2++;
        }

        // 如果匹配到子串末尾，说明子串完全匹配
        if (*s2 == '\0')
        {
            return start; // 返回匹配的起始位置
        }

        str++; // 继续检查主字符串的下一个字符
    }
    return NULL; // 如果没有匹配，返回NULL
}

// 实现字符串删除函数：删除主字符串中所有的子串substr

char *DelSubStr(char *str, const char *substr)
{
    char *result = str;                // 保存主字符串的起始地址
    char *match;                       // 指向匹配子串的位置
    size_t substrLen = strlen(substr); // 子串的长度

    if (substrLen == 0)
    { // 如果子串为空，则直接返回原字符串
        return str;
    }

    while ((match = (char *)MyStrStr(str, substr)) != NULL)
    {
        // 删除匹配到的子串：将子串之后的内容前移覆盖子串
        char *src = match + substrLen; // 子串之后的字符
        char *dst = match;             // 子串的起始位置
        while (*src)
        {
            *dst++ = *src++; // 前移覆盖
        }
        *dst = '\0'; // 补充字符串结束符
    }

    return result; // 返回处理后的字符串首地址
}

int main()
{
    char str[N], substr[M]; // 定义主字符串和子串
    // 输入主字符串
    printf("Enter the main string: ");
    fgets(str, N, stdin);
    str[strcspn(str, "\n")] = '\0'; // 去除换行符

    // 输入子字符串
    printf("Enter the substring to delete: ");
    fgets(substr, M, stdin);
    substr[strcspn(substr, "\n")] = '\0'; // 去除换行符

    // 删除子串并输出结果
    printf("Resulting string: %s\n", DelSubStr(str, substr));
    return 0;
}